package com.marui.eight.complatefuture;

import com.marui.eight.complatefuture.help.MyCompleteTask;

import java.util.concurrent.CompletableFuture;

/**
 * @author marui
 * @version 1.0
 * @date 2021/6/13 12:03 下午
 * @since 1.0
 */
public class Demo2 {
    public static void main(String[] args) throws Exception {
        MyCompleteTask task = new MyCompleteTask();
//        whenComplete(task);
//        exceptionally(task);
//        thenApply(task);
//        handle(task);


    }


    private static void whenComplete(MyCompleteTask task) throws Exception {
        //supplyAsync内部使用ForkJoinPool线程池执行任务
        CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
            return task.doBusiness();
        }).whenComplete((v, r) -> {
            System.out.println("计算结果是: " + v);
        });
        //CompletableFuture里使用的线程池里的线程默认是daemon的。main线程结束后，整个程序也
        //结束了，这里将main线程join后任务里的代码才可以执行完
        System.out.println("end");
        Thread.currentThread().join();
    }

    private static void exceptionally(MyCompleteTask task) throws Exception {
        //supplyAsync内部使用ForkJoinPool线程池执行任务
        CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
            return task.doExceptionBusiness();
        }).exceptionally(e -> {
            System.out.println(e);
            return null;
        });
        //CompletableFuture里使用的线程池里的线程默认是daemon的。main线程结束后，整个程序也
        //结束了，这里将main线程join后任务里的代码才可以执行完
        System.out.println("end");
        Thread.currentThread().join();
    }

    private static void thenApply(MyCompleteTask task) throws Exception {
        //supplyAsync内部使用ForkJoinPool线程池执行任务
        CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
            return task.doBusiness();
        })
        .thenApply(n -> {

            return n + "marui";
        })
        .whenComplete((v, r) -> {
            System.out.println("计算结果是: " + v);
        });
        //CompletableFuture里使用的线程池里的线程默认是daemon的。main线程结束后，整个程序也
        //结束了，这里将main线程join后任务里的代码才可以执行完
        System.out.println("end");
        Thread.currentThread().join();
    }


    private static void handle(MyCompleteTask task) throws Exception {
        //supplyAsync内部使用ForkJoinPool线程池执行任务
        CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
            return task.doExceptionBusiness();
        })
        .handle((result,e)->{
            System.out.println("捕获异常"+e);
            return result;
        })
        .whenComplete((v, r) -> {
            System.out.println("计算结果是: " + v);
        });
        //CompletableFuture里使用的线程池里的线程默认是daemon的。main线程结束后，整个程序也
        //结束了，这里将main线程join后任务里的代码才可以执行完
        System.out.println("end");
        Thread.currentThread().join();
    }






}
